package sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import core.Aluno;
import core.Curso;
import core.Professor;

public class CursoBD {

	private Connection con;
	
	public CursoBD() {
		try {
			
			Class.forName(BancoDados.driverJDBC);
			con = DriverManager.getConnection(BancoDados.dbMySQL, BancoDados.usuario, BancoDados.senha);
			con.setAutoCommit( false );
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}

	public void close() {
		try {

			Class.forName(BancoDados.driverJDBC);
			con.commit();
			con.close();

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public void addCurso( String nome, String codigo ) throws CursoException {
		Statement st;
		
		if( existeCursoNome(nome) ) {
			throw new CursoException( "Nome do Curso já existe." );
		}
		
		if( existeCursoCodigo(codigo) ) {
			throw new CursoException( "Código do Curso já existe." );
		}
		
		try {
			
			st = con.createStatement();
			st.execute( comandoCadastraCurso(nome, codigo) );
			
			con.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Curso getCursoPorID( int idCurso ) {
		
		Statement st;
		ResultSet rs;
		Curso tempCurso;
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoPesquisaCursoPorID( idCurso ) );
			
			if( rs.next() ) {
				
				tempCurso = new Curso( rs.getString("nome"), rs.getString("codigo") );
				return tempCurso;
				
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public Curso getCursoPorCodigo( String codigo ) {
		Statement st;
		ResultSet rs;
		Curso tempCurso;
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoPesquisaCursoPorCodigo( codigo ) );
			
			if( rs.next() ) {
				
				tempCurso = new Curso( rs.getString("nome"), rs.getString("codigo") );
				return tempCurso;
				
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public ArrayList<Curso> getCursos( String nome ) throws ConexaoException {
		Statement st;
		ResultSet rs;

		ArrayList<Curso> lstCurso = new ArrayList<Curso>();

		try {

			st = con.createStatement();
			rs = st.executeQuery( comandoPesquisaCurso( nome ) );

			while( rs.next() ) {

				// Criação do objeto Curso temporario que irá ser adicionado na
				// lista de Cursos encontrados na Query SQL.
				Curso tempCurso = new Curso( rs.getString("nome"), rs.getString("codigo") );

				lstCurso.add( tempCurso );

				con.commit();

			}
		} catch (SQLException e) {
			throw new ConexaoException( e.getMessage() );
		}

		return lstCurso;
	}
	
	public int getIDCurso( Curso curso ) throws CursoException {
		Statement st;
		ResultSet rs;
		
		int resultado = -1;
		
		if( curso == null ) {
			return resultado;
		}
		
		try {
			st = con.createStatement();
			rs = st.executeQuery( comandoCursoID( curso.getNome() , curso.getCodigo() ) );
			
			
			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}
			
			if( resultado < 0 ) {
				throw new CursoException( "Não foi possível obter ID do curso." );
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return resultado;
	}

	public void delCurso( String codigo ) throws CursoException {
		Statement st;
		
		if( !existeCursoCodigo(codigo) ) {
			throw new CursoException( "Código não existe." );
		}
		
		try {
			
			st = con.createStatement();
			st.execute( comandoRemoveCursoCodigo( codigo ) );
			con.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public boolean updateCurso( Curso curso, String codigoAntigo ) { 
		Statement st;

		try {
			
			st = con.createStatement();
			st.execute( comandoAtualizaCurso( curso.getNome(), curso.getCodigo(), codigoAntigo ) );

			con.commit();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}

	private boolean existeCursoNome( String nome ) {

		Statement st;
		ResultSet rs;

		try {

			st = con.createStatement();
			rs = st.executeQuery( comandoNomeCurso( nome ) );

			int resultado = -1;

			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}

			con.commit();

			if( resultado < 1 ) {
				return false;
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean existeCursoCodigo( String codigo ) {

		Statement st;
		ResultSet rs;

		try {

			st = con.createStatement();
			rs = st.executeQuery( comandoCodigoCurso( codigo ) );

			int resultado = -1;

			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}

			con.commit();

			if( resultado < 1 ) {
				return false;
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private String comandoAtualizaCurso(String nome, String codigo, String codigoAntigo ) {
		return "UPDATE curso SET nome = '" + nome + "' , codigo = '" + codigo + "' WHERE STRCMP ( codigo , '" + codigoAntigo + "' ) = 0 ;";
	}
	
	private String comandoCadastraCurso( String nome, String codigo ) {
		return "INSERT INTO curso VALUES ( NULL, '" + nome + "', '" + codigo + "' ) ;";
	}
	
	private String comandoCursoID(String nome, String codigo) {
		return "SELECT id FROM curso WHERE STRCMP ( nome , '" + nome + "' ) = 0 AND STRCMP ( codigo , '" + codigo + "' ) = 0 ;";
	}
	
	private String comandoPesquisaCursoPorCodigo( String codigo ) {
		return "SELECT * FROM curso WHERE STRCMP ( codigo , '" + codigo + "' ) = 0 ;";
	}
	
	private String comandoNomeCurso(String nome) {
		return "SELECT id FROM curso WHERE STRCMP ( nome , '" + nome + "' ) = 0 ;";
	}
	
	private String comandoCodigoCurso(String codigo) {
		return "SELECT id FROM curso WHERE STRCMP ( codigo , '" + codigo + "' ) = 0 ;";
	}

	private String comandoPesquisaCurso( String nome ) {
		return "SELECT * FROM curso WHERE nome LIKE '%" + nome + "%' ;";
	}
	
	private String comandoPesquisaCursoPorID( int id ) {
		return "SELECT * FROM curso WHERE id = " + id + " ;";
	}
	
	private String comandoRemoveCursoCodigo( String codigo ) {
		return "DELETE from curso WHERE STRCMP ( codigo , '" + codigo + "' ) = 0 ;";
	}

}
